/**
 * Nombre del archivo: Stack.java
 * Fecha de creacion: 12 de julio de 2012
 * Descripcion: interfaz de la pila. Es genérica 
 * Basado en la interfaz de Bailey en Java Structures p. 221
 */

/**
 * @author Maria Fernanda Martinez
 * @param <G> 
 */

public interface Stack <G> 
{
    
    /**
     * Nombre: push
     * Descripcion: agrega un objeto a la pila
     * Pre: espacio disponible
     * Post: item agregado a la pila
     * @param item de tipo G
     * Valor de retorno: ninguno
     */
    public void push(G item);
    
    /**
     * Nombre: pop
     * Descripcion: el objeto que entro de ultimo a la pila es retirado de ella
     * Pre: hay item en la pila
     * Post: item removido de la pila
     * Parametros: ninguno
     * @return valor tipo G
     */
    public G pop();
    
    /**
     * Nombre: peek
     * Descripcion: muestra el ultimo valor que ingreso a la pila
     * Pre: hay item en la pila
     * Post: ninguno (solo muestra item)
     * Parametros: ninguno
     * @return valor tipo G
     */
    public G peek();
    
    /**
     * Nombre: empty
     * Descripcion: regresa el valor true si la pila esta vacia
     * Pre: ninguno
     * Post: ninguno (solo regresa true/false)
     * Parametros: ninguno
     * @return valor tipo boolean
     */
    public boolean empty();
    
    /**
     * Nombre: size
     * Descripcion: obtiene la cantidad de elementos presentes en la pila
     * Pre: ninguno
     * Post: ninguno (solo regresa un numero)
     * Parametros: ninguno
     * @return valor tipo int
     */
    public int size();
    
    /**
     * Nombre: operate
     * Descripcion: realiza la operacion con dos numeros basado en el operador ingresado
     * Pre: existen dos valores numericos y un operador
     * Post: resultado de la operacion
     * @param a de tipo float
     * @param b de tipo float
     * @param op de tipo String
     * @return valor tipo float
     */
    public float operate(float a, float b, String op);
    
    /**
     * Nombre: isNumeric
     * Descripcion: regresa true si los caracteres de la cadena representan un numero
     * Pre: existe una cadena de caracteres
     * Post: ninguno (solo regresa true/false)
     * @param cadena de tipo String
     * @return valor tipo boolean
     */
    public boolean isNumeric(String cadena);
        
    /**
     * Nombre: isSymbol
     * Descripcion: regresa true si la cadena ingresada es un operador
     * Pre: existe una cadena con un caracter
     * Post: ninguno (solo regresa true/false)
     * @param cadena de tipo String
     * @return  valor tipo boolean
     */
    public boolean isSymbol(String cadena);
    
    /**
     * Nombre: clear
     * Descripcion: saca todos los elementos de la pila
     * Pre: ninguno
     * Post: pila vacia
     * Parametros: ninguno
     * Valor de retorno: ninguno
     */
    public void clear();
}
